package ar.edu.untref.robotica;

import java.awt.Image;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

import javax.imageio.ImageIO;

import ar.edu.untref.robotica.simulador.Configuracion;
import ar.edu.untref.robotica.simulador.Escenario;
import ar.edu.untref.robotica.simulador.Posicion;
import ar.edu.untref.robotica.simulador.Simulador;

public class Aplicacion {

	private static final String RUTA_ARCHIVO_DE_CONFIGURACION = "configuracion/configuracion.properties";

	public static void main(String[] args) throws IOException {

		leerConfiguracion();

		try {

			Image imagen = ImageIO.read(new File(Configuracion.instancia()
					.getRutaDelMapa()));

			Escenario escenario = new Escenario(imagen);
			Simulador simulador = new Simulador(escenario);
			simulador.inicializar();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Lee el archivo de configuración ubicado en RUTA_ARCHIVO_DE_CONFIGURACION
	 * y configura el sistema para utilizar los valores que se indican en él.
	 * 
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	private static void leerConfiguracion() throws FileNotFoundException,
			IOException {

		Configuracion configuracion = Configuracion.instancia();

		File archivoDeConfiguracion = new File(RUTA_ARCHIVO_DE_CONFIGURACION);
		FileInputStream lecturaDelArchivo = new FileInputStream(
				archivoDeConfiguracion);

		Properties p = new Properties();
		p.load(lecturaDelArchivo);

		String rutaDelMapa = p.getProperty("rutaDelMapa", "/escenario/map.bmp");
		configuracion.setRutaDelMapa(rutaDelMapa);

		double posicionInicialRobotX = Double.valueOf(p.getProperty(
				"posicionInicialRobotX", "50"));
		double posicionInicialRobotY = Double.valueOf(p.getProperty(
				"posicionInicialRobotY", "50"));
		double anguloDeOrientacionInicialRobot = Double.valueOf(p.getProperty(
				"anguloDeOrientacionInicialRobot", "0"));
		configuracion.setPosicionInicial(new Posicion(posicionInicialRobotX,
				posicionInicialRobotY, anguloDeOrientacionInicialRobot));

		double altoRobot = Double.valueOf(p.getProperty("altoRobot", "30"));
		configuracion.setAltoRobot(altoRobot);

		double anchoRobot = Double.valueOf(p.getProperty("anchoRobot", "30"));
		configuracion.setAnchoRobot(anchoRobot);

		double distanciaSegura = Double.valueOf(p.getProperty(
				"distanciaSegura", "20"));
		configuracion.setDistanciaSegura(distanciaSegura);

		double relacionCentimetroCelda = Double.valueOf(p.getProperty(
				"relacionCentimetroCelda", "1"));
		configuracion.setRelacionCentimetroCelda(relacionCentimetroCelda);

		// Sensores
		double sensorFrontal1Angulo = Double.valueOf(p.getProperty("SF1angulo",
				"0"));
		configuracion.setSensorFrontal1Angulo(sensorFrontal1Angulo);
		double sensorFrontal1X = Double.valueOf(p.getProperty("SF1posicionX",
				"-7"));
		configuracion.setSensorFrontal1X(sensorFrontal1X);
		double sensorFrontal1Y = Double.valueOf(p.getProperty("SF1posicionY",
				"-13"));
		configuracion.setSensorFrontal1Y(sensorFrontal1Y);

		double sensorFrontal2Angulo = Double.valueOf(p.getProperty("SF2angulo",
				"0"));
		configuracion.setSensorFrontal2Angulo(sensorFrontal2Angulo);
		double sensorFrontal2X = Double.valueOf(p.getProperty("SF2posicionX",
				"7"));
		configuracion.setSensorFrontal2X(sensorFrontal2X);
		double sensorFrontal2Y = Double.valueOf(p.getProperty("SF2posicionY",
				"-13"));
		configuracion.setSensorFrontal2Y(sensorFrontal2Y);

		double sensorDerechoAngulo = Double.valueOf(p.getProperty("SDangulo",
				"45"));
		configuracion.setSensorDerechoAngulo(sensorDerechoAngulo);
		double sensorDerechoX = Double.valueOf(p.getProperty("SDposicionX",
				"12"));
		configuracion.setSensorDerechoX(sensorDerechoX);
		double sensorDerechoY = Double.valueOf(p.getProperty("SDposicionY",
				"-13"));
		configuracion.setSensorDerechoY(sensorDerechoY);

		double sensorIzquierdoAngulo = Double.valueOf(p.getProperty("SIangulo",
				"315"));
		configuracion.setSensorIzquierdoAngulo(sensorIzquierdoAngulo);
		double sensorIzquierdoX = Double.valueOf(p.getProperty("SIposicionX",
				"-12"));
		configuracion.setSensorIzquierdoX(sensorIzquierdoX);
		double sensorIzquierdoY = Double.valueOf(p.getProperty("SIposicionY",
				"-13"));
		configuracion.setSensorIzquierdoY(sensorIzquierdoY);

		double sensorAtrasAngulo = Double.valueOf(p.getProperty("SAangulo",
				"180"));
		configuracion.setSensorAtrasAngulo(sensorAtrasAngulo);
		double sensorAtrasX = Double.valueOf(p.getProperty("SAposicionX", "0"));
		configuracion.setSensorAtrasX(sensorAtrasX);
		double sensorAtrasY = Double
				.valueOf(p.getProperty("SAposicionY", "13"));
		configuracion.setSensorAtrasY(sensorAtrasY);
	}

}
